/*当出现 panic 时，程序默认会开始 展开（unwinding），这意味着 Rust 会回溯栈并清理它遇到的每一个函数的数据，不过这个回溯并清理的过程有很多工作。另一种选择是直接 终止（abort），这会不清理数据就退出程序。那么程序所使用的内存需要由操作系统来清理。如果你需要项目的最终二进制文件越小越好，panic 时通过在 Cargo.toml 的 [profile] 部分增加 panic = 'abort'，可以由展开切换为终止。例如，如果你想要在release模式中 panic 时直接终止：

[profile.release]
panic = 'abort'
 */

use std::fs::File;

/*
遇到 panic 时输出更加详细的信息(包括被调用的包的信息)
RUST_BACKTRACE=1 cargo run
 */
fn main() {
    // 文件不存在的错误
    // let res = File::open("./config.ini");
    // let f = match res {
    //     Ok(f) => f,
    //     Err(_) => {
    //         panic!("open config.ini failed");
    //     }
    // };
    // println!("{:?}", f);

    // 不存在则创建
    let res = File::open("./config.ini");
    let f = match res {
        Ok(f) => f,
        Err(e) => match e.kind() {
            std::io::ErrorKind::NotFound => match File::create("./config.ini") {
                Ok(fc) => fc,
                Err(e) => panic!("{:?}", e),
            },
            _other_error => {
                println!("open config.ini failed");
                return;
            }
        },
    };
    println!("{:?}", f);

    // let f = File::open("config").unwrap(); // 错误时 panic

    let f = File::open("config").expect("文件打开错误"); // 自定义错误信息
    println!("{:?}", f);
}
